package com.xjtu.config;

import com.alibaba.fastjson.JSONObject;
import com.xjtu.model.User;
import lombok.extern.slf4j.Slf4j;

import javax.websocket.Session;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

@Slf4j
public class SocketManager {

    /**
     * 保存新加入的设备id与session映射
     */
    private static final Map<String, Session> SESSION_MAP = new ConcurrentHashMap<>();

    /**
     * 保存新加入的设备id与用户映射
     */
    private static final Map<String, User> DEVICE_USER_MAP = new ConcurrentHashMap<>();


    /**
     * 给全部在线设备发送心跳
     */
    public static void sendPing() {
        SocketManager.SESSION_MAP.forEach((k , v) -> {
            JSONObject object = new JSONObject();
            object.put("type", "ping");
            sendMessage(v, object.toJSONString());
        });
    }

    /**
     * 添加新加入的设备id与session映射
     */
    public static void addSession(String deviceId, Session session) {
        SESSION_MAP.put(deviceId, session);
    }

    /**
     * 根据session id移除session
     */
    public static void removeSession(String sessionId) {
        String id = findIdBySessionId(sessionId);
        if (id == null) return;
        SESSION_MAP.remove(id);
    }

    /**
     * 根据sessionId查找设备id
     */
    public static String findIdBySessionId(String sessionId) {
        String id = null;
        for (Map.Entry<String, Session> entry : SESSION_MAP.entrySet()) {
            if (entry.getValue().getId().equals(sessionId)) {
                id = entry.getKey();
                break;
            }
        }
        return id;
    }

    /**
     * 给指定设备id发送消息
     */
    public static boolean sendMessage(Session session, String message) {
        if (session == null) return false;
        //异步发送消息
        session.getAsyncRemote().sendText(message);
        return true;
    }

    /**
     * 给指定设备id发送消息
     */
    public static boolean sendMessage(String id, String message) {
        if (id == null) return false;
        Session session = SESSION_MAP.get(id);
        if (session == null) return false;
        return sendMessage(session, message);
    }

    /**
     * 用户上线
     */
    public static void addUser(String id, User user) {
        DEVICE_USER_MAP.put(id, user);
    }

    /**
     * 用户下线
     */
    public static void removeUser(String id) {
        DEVICE_USER_MAP.remove(id);
    }

    /**
     * 查看当前在线用户信息
     */
    public static Map<String, User> listUser() {
        return DEVICE_USER_MAP;
    }

    /**
     * 根据设备号查找用户
     */
    public static User getUser(String id) {
        return DEVICE_USER_MAP.get(id);
    }
}